✅ 서비스 인스턴스를 자동으로 등록하고 검색 가능
✅ IP 주소가 동적으로 변경되어도 항상 최신 정보를 제공
Netflix Eureka는 Netflix OSS(Open Source Software)에서 제공하는 Service Discovery(서비스 디스커버리) 서버 및 클라이언트 라이브러리
마이크로서비스 환경에서 동적으로 서비스 인스턴스를 등록하고 검색할 수 있도록 도움
📌 Netflix Eureka 구성 요소
Eureka는 클라이언트/서버 아키텍처로 구성되며, Eureka Server와 Eureka Client로 구분
| 구성 요소 | 역할 |
|---|---|
| Eureka Server | 서비스 등록 및 검색을 관리하는 중앙 서버 |
| Eureka Client | Eureka Server에 서비스 등록 및 조회하는 클라이언트 |
✅ Eureka Server는 독립적인 서비스로 실행되며, Eureka Client가 이를 사용하여 서비스를 등록하고 조회
Eureka Server
✅ Netflix에서 제공하는 Servcie Discovery Server 라이브러리
✅ MSA에서 서비스 등록 및 검색 기능 제공
📌 Netflix Eureka Server의 역할
✅ 서비스 등록: 마이크로서비스가 실행되면서 Eureka Server에 자신을 등록
✅ 서비스 검색: 마이크로서비스가 Eureka Server에서 다른 서비스의 위치(IP, 포트)를 조회
✅ 헬스 체크
- 서비스가 정상적으로 실행되고 있는지 주기적으로 상태를 체크(heartbeat)
- 일정 시간 응답이 없으면 자동으로 해당 서비스 제거
📌 Netflix Eureka Server 설정 및 실행
✅ build.gradle
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'✅ .java
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryserviceApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryserviceApplication.class, args);
}
}@EnableEurekaServer: 해당 서버를 discovery service로 지정
✅ 설정 파일
server:
port: 8761
spring:
application:
name: discoveryservice
eureka:
client:
register-with-eureka: false
fetch-registry: false- application.name: 해당 애플리케이션 서버의 이름(고유한 id)
- register-with-eureka: discovery service에 client로 등록할 것인지에 대한 설정값
- fetch-registry: 다른 서비스의 정보를 가져오는지 여부
- Eureka Server에서 제공하는 대시보드 조회 가능
- 어떤 인스턴스가 등록되었는지 확인 가능
Netflix Eureka Client
✅ Eureka Server에 자신을 등록하고, 다른 서비스의 위치를 조회 가능
📌 Netflix Eureka Client 설정 및 실행
✅ build.gradle
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'✅ 설정 파일
server:
port: 9001
spring:
application:
name: user-service
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:8761/eureka- application.name: 해당 애플리케이션 서버의 이름(고유한 id)
- register-with-eureka: discovery service에 client로 등록
- fetch-registry: 다른 서비스의 정보를 가져올 것
- 인스턴스가 정상적으로 등록
- 현재는 port가 명시적으로 지정되어 있기 때문에 Scale Out 시 여러 User Service 인스턴스를 등록할 수 없다.
📌 Random Port 설정
✅ 설정 파일
server:
port: 0
spring:
application:
name: user-service
eureka:
instance:
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:8761/eureka- server.port : 0: 사용 가능한 포트를 자동 할당
-
instance-id
- Eureka는 기본적으로
host ip : service name : port를 기준으로 서비스 인스턴스를 등록 - 동일한 User Service를 여러 개 실행하면 위 값이 동일하여 문제 발생 가능
- 이를 해결하기 위해
instance-id를 고유한 값으로 설정하여 각 인스턴스를 개별적으로 인식
- Eureka는 기본적으로
- 두 user-service 인스턴스가 정상적으로 등록